const Utils = {
  // 从url获取参数，并且转换成对象
  getParameters: URL =>
    JSON.parse(
      `{"${decodeURI(URL.split('?')[1])
        .replace(/"/g, '"')
        .replace(/&/g, '","')
        .replace(/=/g, '":"')}"}`
    ),
  // 检查设备类型
  judgeDeviceType: () =>
    /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|OperaMini/i.test(
      navigator.userAgent
    )
      ? 'Mobile'
      : 'PC',
  // 文字复制到剪切板
  copyText: async text => await navigator.clipboard.writeText(text),
  // 获取当前日期（年月日）
  getToday: () => {
    let date = new Date()
    let y = date.getFullYear()
    let m = date.getMonth()
    let d = date.getDate()
    let week = new Date().getDay()
    let weekText = ['日', '一', '二', '三', '四', '五', '六']
    let formatWeek = '星期' + weekText[week]
    let today = {
      date: y + '-' + Utils.formatNum(m + 1) + '-' + Utils.formatNum(d),
      week: formatWeek
    }
    return today
  },
  formatNum: num => {
    let res = Number(num)
    return res < 10 ? '0' + res : res
  },
  // 获取当前日期 (年月日时分秒)
  getNowDate: () => {
    var date = new Date()
    var sign2 = ':'
    var year = date.getFullYear() // 年
    var month = date.getMonth() + 1 // 月
    var day = date.getDate() // 日
    var hour = date.getHours() // 时
    var minutes = date.getMinutes() // 分
    var seconds = date.getSeconds() //秒
    if (month >= 1 && month <= 9) {
      month = '0' + month
    }
    if (day >= 0 && day <= 9) {
      day = '0' + day
    }
    if (hour >= 0 && hour <= 9) {
      hour = '0' + hour
    }
    if (minutes >= 0 && minutes <= 9) {
      minutes = '0' + minutes
    }
    if (seconds >= 0 && seconds <= 9) {
      seconds = '0' + seconds
    }
    return (
      year +
      '-' +
      month +
      '-' +
      day +
      ' ' +
      hour +
      sign2 +
      minutes +
      sign2 +
      seconds
    )
  },
  /**
   * 查询某天是否为工作日
   *
   * @param {Date}
   * @returns {Boolean} 返回true/false
   */
  isWeekday: date => date.getDay() % 6 !== 0,
  /**
   * 两日期之间相差的天数
   *
   * @param {Date}
   * @returns {Number} 返回天数
   */
  dayDiff: (date1, date2) =>
    Math.ceil(Math.abs(date1.getTime() - date2.getTime()) / 86400000),
  /**
   * 查找日期位于一年中的第几天
   *
   * @param {Date} data 需要查找的日期
   * @returns {Number} 返回天数
   */
  dayOfYear: date =>
    Math.floor(
      (date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24
    ),
  /**
   * 获取一段时间的日期（当前时间为起点）
   *
   * @param {Number} start 时间偏差 例如 昨天 -1 ；明天 1
   * @param {Number} end 获取多少天 默认7天
   * @returns {Array} 返回数据列表
   */
  getDataList: (start = 0, end = 7) => {
    let myDate = new Date() //获取系统当前时间
    let getDate = myDate.getDate()

    let tiemArr = []
    for (let i = 0; i < end; i++) {
      let today = new Date() //每次循环将时间初始为当前时间
      let str = getDate + start + i
      today.setDate(str)
      const getDay = today.getDay()
      tiemArr.push({
        date: today,
        text: `${today.getMonth() + 1}月${today.getDate()}日（${
          getDay == 0
            ? '星期日'
            : getDay == 1
            ? '星期一'
            : getDay == 2
            ? '星期二'
            : getDay == 3
            ? '星期三'
            : getDay == 4
            ? '星期四'
            : getDay == 5
            ? '星期五'
            : getDay == 6
            ? '星期六'
            : ''
        })`
      })
    }
    return tiemArr
  },
  // 获取当前时分秒
  timeFromDate: () => new Date().toTimeString().slice(0, 8),
  /**
   * 扁平数据结构转换为树型结构
   *
   * @param {Array}  list 扁平数据结构
   * @param {String} parentId 关联父级id的字段名
   * @param {String} childName
   * @returns {Object} 返回树型结构
   */
  listToTree: (list, parentId = 'parentId', childName = 'children') => {
    const res = []
    const map = list.reduce((res, v) => ((res[v.id] = v), res), {})

    for (const item of list) {
      if (item[parentId] === 0) {
        res.push(item)
        continue
      }
      if (item[parentId] in map) {
        const parent = map[item[parentId]]
        parent[childName] = parent[childName] || []
        parent[childName].push(item)
      }
    }
    return res
  },
  /**
   * 树形结构转扁平数组列表
   *
   * @param {Array}  data 树形结构
   * @param {String} childName 子级的字段名
   * @returns {Object} 返回扁平数组列表
   */
  treeToList: (data, childName = 'children') => {
    return data.reduce(
      (prev, cur) => prev.concat([cur], this.treeToList(cur[childName] || [])),
      []
    )
  },
  /**
   * 深度克隆
   *
   * @param {Object} obj 传入需要克隆的对象
   * @returns {Object} 返回克隆好的对象
   */
  deepClone(obj) {
    let result
    let objClass = Object.prototype.toString.call(obj).slice(8, -1)
    if (objClass === 'Object') {
      result = {}
    } else if (objClass === 'Array') {
      result = []
    } else {
      return obj
    }
    // 遍历目标对象
    for (let key in obj) {
      let value = obj[key]
      result[key] = this.deepClone(value)
    }

    return result
  },
  /**
   * 截取小数点N位，超出部分舍弃  不做四舍五入
   *
   * @param {String} string 传入带小数点的数字
   * @param {regular} regular 传入正则 默认 /^(\-)*(\d+)\.(\d\d).*$/ 保留2位小数
   * @returns {string} 返回处理好的数字
   */
  cutOut(string, regular = /^(\-)*(\d+)\.(\d\d).*$/) {
    let value = string
    if (typeof value != 'string') return
    value = value.replace(/[^\d.]/g, '') //清除“数字”和“.”以外的字符
    value = value.replace(regular, '$1$2.$3') //只能输入两个小数
    // value = value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入2个小数
    // value = value.replace(/^(\-)*(\d+)\.(\d\d\d).*$/, '$1$2.$3');//只能输入3个小数
    // value = value.replace(/^(\-)*(\d+)\.(\d\d\d\d).*$/, '$1$2.$3'); //只能输入4个小数
    if (value.indexOf('.') < 0 && value != '') {
      //以上已经过滤，此处控制的是如果没有小数点，首位不能为类似于 01、02
      value = parseFloat(value)
    }
    return value
  },
  /**
   * 中国标准时间 转 年-月-日
   * @param {Date} time 中国标准时间：Thu Sep 22 2023 08:51:02 GMT+0800 (中国标准时间)
   * @returns {String} 年-月-日
   */
  newDate(time) {
    var date = new Date(time)
    var y = date.getFullYear()
    var m = date.getMonth() + 1
    m = m < 10 ? '0' + m : m
    var d = date.getDate()
    d = d < 10 ? '0' + d : d
    return y + '-' + m + '-' + d
  },
  /**
   * 中国标准时间 转 年-月-日 时:分:秒
   * @param {Date} time 中国标准时间：Thu Sep 22 2023 08:51:02 GMT+0800 (中国标准时间)
   * @returns {String} 年-月-日 时:分:秒
   */

  newDate2(time) {
    var date = new Date(time)
    var y = date.getFullYear()
    var m = date.getMonth() + 1
    m = m < 10 ? '0' + m : m
    var d = date.getDate()
    d = d < 10 ? '0' + d : d
    var h = date.getHours()
    h = h < 10 ? '0' + h : h
    var minute = date.getMinutes()
    minute = minute < 10 ? '0' + minute : minute
    var s = date.getSeconds()
    s = s < 10 ? '0' + s : s
    return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + s
  }
}

export default Utils
